package cryptology1

import (
	"bytes"
	"crypto/des"
	"crypto/cipher"
)

//填充量
func PKCSpading(srcText []byte, blocksize int) []byte {
	//1.先找到分组增量的长度，不如123*****
	paddingLen := blocksize - len(srcText)%blocksize
	//2.增加1个字节的值byte(paddingLen),获得总填充量
	paddingText := bytes.Repeat([]byte{byte(paddingLen)}, paddingLen)
	//3.拼接成明文
	plainText := append(srcText, paddingText...)
	return plainText

}

//还原
func PKCSunpading(orignText []byte) []byte {
	//密文长度
	orignTextLen := len(orignText)
	//*就是最后一个字节，数字等于填充字符长度
	paddingLen := int(orignText[orignTextLen-1])
	//还原
	srcText := orignText[:(orignTextLen - paddingLen)]
	return srcText

}

/*
CBC加密
 */
func DESenCrypto(srcText, key []byte) []byte {
	//创建des对象
	block, err := des.NewCipher(key)
	if err != nil {
		panic(err)
	}
	iv := []byte("12345678")
	//分组模式
	cbcEncrypter := cipher.NewCBCEncrypter(block, iv)
	//获取密文
	plainText := PKCSpading(srcText, block.BlockSize())
	//加密
	cbcEncrypter.CryptBlocks(plainText, plainText)
	return plainText
}


/*
CBC解密
 */
func DESdeCrypto(srcText, key []byte) []byte {
	//创建des对象
	block, err := des.NewCipher(key)
	if err != nil {
		panic(err)
	}
	iv := []byte("12345678")
	//分组模式
	cbcEncrypter := cipher.NewCBCDecrypter(block, iv)

	//解密
	cbcEncrypter.CryptBlocks(srcText, srcText)

	//获取明文
	srcText = PKCSunpading(srcText)
	return srcText
}
